package com.equis.estacionamientos.bean.estacionamiento {
	import com.equis.estacionamientos.bean.ModelLocator;
	import com.equis.estacionamientos.components.map.InfoWindowSprite;
	import com.equis.estacionamientos.services.EstacionamientoService;
	import com.equis.estacionamientos.services.EstacionamientoServiceFactory;
	import com.google.maps.InfoWindowOptions;
	import com.google.maps.LatLng;
	import com.google.maps.MapMouseEvent;
	import com.google.maps.overlays.Marker;
	import com.google.maps.overlays.MarkerOptions;
	import com.google.maps.styles.FillStyle;
	import com.google.maps.styles.StrokeStyle;
	
	import flash.display.DisplayObject;
	import flash.geom.Point;
	
	import mx.events.CloseEvent;
	
	[Bindable]
	[RemoteClass(alias="com.estacionamientos.dto.EstacionamientoSimpleDTO")]
	public class Estacionamiento extends EstacionamientoBase implements IEstacionamiento {
		
		private var _tipo:TipoEstacionamiento;
		private var _marker:Marker;

		private var _infoWindowOptions:InfoWindowOptions;
		
		public function Estacionamiento() {
			super();
		}
		
		public function get tipo():TipoEstacionamiento {
			if(_tipo == null) {
				_tipo = TipoEstacionamiento.getTipoFor(this);
			}
			return _tipo;
		}

		public function set tipo(value:TipoEstacionamiento):void {
			_tipo = value;
		}
		
		public function get marker():Marker {
			if(_marker == null){
				_marker = new Marker(
					new LatLng(this.latitud, this.longitud),
					new MarkerOptions({
						strokeStyle: new StrokeStyle({color: 0x987654}),
						fillStyle: new FillStyle({color: 0x223344, alpha: 0.8}),
						radius: 12,
						hasShadow: true
					})
				);
				_marker.addEventListener(MapMouseEvent.CLICK, markerClickHandler);
			}
			return _marker;
		}
		
		public function set marker(value:Marker):void {
			this._marker = value;
		}
		
		private function markerClickHandler(event:MapMouseEvent):void {
			if(_infoWindowOptions == null) {
				var service:EstacionamientoService = EstacionamientoServiceFactory.INSTANCE.buildService();
				service.blocking = true;
				service.callbackFunction = getEstacionamientoHandler;
				service.getEstacionamiento(id);
			} else {
				showInfoWindow();
			}
		}
		
		private function getEstacionamientoHandler(value:FullEstacionamiento):void {
			var customContent:DisplayObject = new InfoWindowSprite(value);
			customContent.addEventListener(CloseEvent.CLOSE, function(event:CloseEvent):void { 
				ModelLocator.getInstance().googleMap.closeInfoWindow();
			});
			_infoWindowOptions = new InfoWindowOptions(
				{
					title: value.nombreContacto, content: value.razonSocial
//				customContent: customContent,
//				customOffset: new Point(0, 10)
			});
			showInfoWindow();
		}
		
		public function showInfoWindow():void {
			_marker.openInfoWindow(_infoWindowOptions); 
		}

	}
}